関数ノードポリシー

[flow_graph.function_node_policies]

function_nodemultifunction_nodeasync_node および continue_node は、タグクラスのセットとして表現される Policy パラメーターで指定できます。このパラメーターはノードの実行動作に影響します。


// <oneapi/tbb/flow_graph.h> ヘッダーで定義 

namespace oneapi { 
namespace tbb { 
namespace flow { 

    class queueing { /*unspecified*/ }; 
    class rejecting { /*unspecified*/ }; 
    class lightweight { /*unspecified*/ }; 
    class queueing_lightweight { /*unspecified*/ }; 
    class rejecting_lightweight { /*unspecified*/ }; 

} // namespace flow 
} // namespace tbb 
} // namespace oneapi

各ポリシークラスは、[copyconstructible] ISO C++ 標準の CopyConstructible の要件を満たしている必要があります。

キューイング

このポリシーは、入力メッセージを受け入れる動作を定義します。キューイング (queueing) ポリシーは、すぐに処理できない入力メッセージが、処理可能になった時に処理されることを意味します。

拒否

このポリシーは、入力メッセージを受け入れる動作を定義します。拒否 (rejecting) ポリシーは、すぐに処理できない入力メッセージがノードで受け入れられないことを意味し、それを処理するのはプレディセッサーの役割です。

軽量

このポリシーでは、ノードの実行に関わるオーバーヘッドを軽減する実装に対する拘束力にないヒントとして、ノード本体の処理にほとんど時間を要しないことを指定できます。実装が適用する最適化では、ノードとグラフの実行に影響を与えてはなりません。

ほかのポリシーと組み合わせると、軽量 (lightweight) ポリシーは、最適化のヒントを基にほかのポリシーの動作を拡張します。この規則は、Policy テンプレート・パラメーターのデフォルト値を持つ機能ノードに自動的に適用されます。例えば、Policy のデフォルト値がキューイング (queueing) である場合、Policy 値に軽量 (lightweight) を指定するとキューイング軽量 (queueing_lightweight) を指定するのと同等です。

ノード本体の関数呼び出し operator() は、軽量ポリシーを有効にする場合 noexcept でなければなりません。

以下は、パイプライン・トポロジーを使用したグラフに軽量 (lightweight) ポリシーを適用する例を示します。2 番目と 3 番目のノードのボディーは小さいため、これらのノードに軽量 (lightweight) ポリシーを適用するには妥当です。これにより、2 番目と 3 番目のノードのタスクは、スケジュールのオーバーヘッドなしで実行できます。グラフの同時呼び出しを許可するため、最初のノードには軽量 (lightweight) ポリシーが指定されていません。


#include "oneapi/tbb/flow_graph.h" 

int main() { 
    using namespace oneapi::tbb::flow; 

    graph g; 

    function_node< int, int > add( g, unlimited, [](const int &v) { 
        return v+1; 
    } ); 
    function_node< int, int, lightweight > multiply( g, unlimited, [](const int &v) noexcept { 
        return v*2; 
    } ); 
    function_node< int, int, lightweight > cube( g, unlimited, [](const int &v) noexcept { 
        return v*v*v; 
    } ); 

    make_edge(add, multiply); 
    make_edge(multiply, cube); 

    for(int i = 1; i <= 10; ++i) 
        add.try_put(i); 
    g.wait_for_all(); 

    return 0; 
}